/*
Este programa es un analizador lexico para el compilador del lenguaje de programacion c--
Copyright © 2011  Martinelli, Fernán Gabriel (fmartinelli89@gmail.com)
			      Riberi, Franco Gaspar      (fgriberi@gmail.com)
			      Varea, Agustín	         (agvarea@gmail.com)

Todos los derechos reservados

Este programa es software libre: usted puede redistribuirlo y/o modificarlo conforme a los términos 
de la Licencia Pública General de GNU publicada por la Fundación para el Software Libre, ya sea la 
versión 3 de esta Licencia o (a su elección) cualquier versión posterior.

Este programa se distribuye con el deseo de que le resulte útil, pero SIN GARANTÍAS DE NINGÚN TIPO; 
ni siquiera con las garantías implícitas de COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO DETERMINADO.  
Para más información, consulte la Licencia Pública General de GNU.

Junto con este programa, se debería incluir una copia de la Licencia Pública General de GNU.
De no ser así, ingrese en <http://www.gnu.org/licenses/>.

*/

%{
#include <stdio.h>
#include <stdlib.h>
#include "y.tab.h"  /* Es un generador automatico para Bison */
int num_lineas = 1;
int num_columnas = 0;
%}

%option noyywrap 

/* Definiciones regulares */
Digito [0-9]
Letra [a-zA-Z]
Identifier {Letra}({Letra}|{Digito})*
IntDenotation {Digito}+
FloatDenotation ({Digito})*"."({Digito})*(("E"|"e")("+"|"-")({Digito})+)?
comentarios "/*"([^*]|"*"[^/])*"*/" 

/* yyLval es un struct, contiene la estructura de datos de la pila con la que trabaja YACC, sirve para el intercambio de informacion lex-yacc  */

/* EXPRESIONES LOGICAS,MATEMATICAS Y RELACIONALES */
%%
"while"			{ return WHILE; num_columnas=num_columnas+5; }
"break"			{ return BREAK; num_columnas=num_columnas+5; }
"continue"		{ return CONTINUE; num_columnas=num_columnas+8; }
"if"			{ return IF; num_columnas=num_columnas+2; }
"else"			{ return ELSE; num_columnas=num_columnas+4; }
"return"		{ return RETURN; num_columnas=num_columnas+6; }	
"int"			{ return INT; num_columnas=num_columnas+3; }
"float"			{ return FLOAT; num_columnas=num_columnas+5; }

"=="			{ return IGUALIGUAL; num_columnas=num_columnas+2; }
"="				{ return ('='); num_columnas=num_columnas+1; }
":"				{ return (':'); num_columnas=num_columnas+1; }
"?"				{ return ('?'); num_columnas=num_columnas+1; }
"&&"			{ return AMPERAMPER; num_columnas=num_columnas+2; }
"||"			{ return BARRABARRA; num_columnas=num_columnas+2; }
"<"				{ return ('<'); num_columnas=num_columnas+1; }
">"				{ return ('>'); num_columnas=num_columnas+1; }
"+"				{ return ('+'); num_columnas=num_columnas+1; } 
"-"				{ return ('-'); num_columnas=num_columnas+1; }
"*"				{ return ('*'); num_columnas=num_columnas+1; }
"/"				{ return ('/'); num_columnas=num_columnas+1; }
"%"				{ return ('%'); num_columnas=num_columnas+1; }
"!"				{ return ('!'); num_columnas=num_columnas+1; }
"("				{ return ('('); num_columnas=num_columnas+1; } 
")"				{ return (')'); num_columnas=num_columnas+1; }
","				{ return (','); num_columnas=num_columnas+1; }
"{"				{ return ('{'); num_columnas=num_columnas+1; }
"}"				{ return ('}'); num_columnas=num_columnas+1; }
";"				{ return (';'); num_columnas=num_columnas+1; }
"\n"			{ num_lineas=num_lineas+yyleng; num_columnas=0;}
"\t"			/*ignoro tabulaciones*/       { num_columnas=num_columnas+yyleng; }
" "				/*ignoro espacios en blanco*/ { num_columnas=num_columnas+yyleng; }

{Identifier}		{ yylval.id = (char *) malloc (strlen(yytext) * sizeof(char*)); strcpy(yylval.id,yytext); return IDENTIFIER; 
					  num_columnas=num_columnas+yyleng; } 	 					/*diferente a yylval.id = yyetxt*/
					/*es un puntero (a char) por eso necesito alojar memoria*/ 
							
{FloatDenotation}	{ yylval.ffloat = (float)atof(yytext); return FLOATDENOTATION; num_columnas=num_columnas+yyleng; }		 

{IntDenotation}		{ yylval.iint = atoi(yytext); return INTDENOTATION; num_columnas=num_columnas+yyleng; }    
    
{comentarios}	    {}    

.					{mostrarError2(11,num_lineas,num_columnas); exit(1);}
%%
